package com.yv.security.core.validate.code;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.ServletWebRequest;
/**
 * 获取验证码(图形/短信 etc)
 * @author Administrator
 *
 */
@RestController
public class ValidateCodeController {
	
	//---------------------
	// 图形验证和短信验证重构
	//---------------------
	
	// 声明接口类型的变量，(依赖搜索)编译时实例化接口的实现
	@Autowired
	private Map<String, ValidateCodeProcessor> validateCodeProcessors;
	
	
	@GetMapping("/code/{type}")
	public void createCode(HttpServletRequest request, HttpServletResponse response, @PathVariable String type) throws Exception {
		validateCodeProcessors.get(type+"ValidateCodeProcessor").create(new ServletWebRequest(request, response));
	}
	
	
	
	//---------------------
	// 图形验证和短信验证原版
	//---------------------
	/*static final String SESSION_KEY = "SESSION_KEY_IMAGE_CODE";
	
	private Logger logger =  LoggerFactory.getLogger(getClass());
	
	// Put code in session
	private SessionStrategy sessionStrategy = new HttpSessionSessionStrategy();
	
	@Autowired
	private ValidateCodeGenerator imageCodeGenerator;
	
	// 加了短信验证码后启动报错,提示有两个bean.
	@Autowired
	private ValidateCodeGenerator smsCodeGenerator;
	
	@Autowired
	private SmsCodeSender smsCodeSender;
	
	// 图形验证码Version2: 可配置验证码生成逻辑
	@GetMapping("/code/image")
	public void createCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
		logger.info("[ValidateCodeController] /code/image was called......");
		ImageCode imageCode = (ImageCode) imageCodeGenerator.generate(new ServletWebRequest(request, response));
		// Retreive session from HttpServletRequest.
		sessionStrategy.setAttribute(new ServletWebRequest(request), SESSION_KEY, imageCode);
		ImageIO.write(imageCode.getImage(), "JPEG", response.getOutputStream());
	}
	
	@GetMapping("/code/sms")
	public void createSms(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletRequestBindingException {
		logger.info("[ValidateCodeController] /code/sms was called......");
		ValidateCode smsCode = smsCodeGenerator.generate(new ServletWebRequest(request, response));
		sessionStrategy.setAttribute(new ServletWebRequest(request), SESSION_KEY, smsCode);
		// Call SMS suppliers' interface to send sms.
		String mobile = ServletRequestUtils.getRequiredStringParameter(request, "mobile");
		smsCodeSender.send(mobile, smsCode.getCode());
	}*/
	
	
	
	
	
	
	
	
	
	
	// 图形验证码Version1: 简单版本,固定的验证码(样式)生成逻辑
	/*@Autowired
	private SecurityProperties securityProperties;
	
	@GetMapping("/code/image")
	public void createCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
		logger.info("[ValidateCodeController] /code/image was called......");
		ImageCode imageCode = createImageCode(new ServletWebRequest(request, response));
		// Retreive session from HttpServletRequest
		sessionStrategy.setAttribute(new ServletWebRequest(request), SESSION_KEY, imageCode);
		ImageIO.write(imageCode.getImage(), "JPEG", response.getOutputStream());
	}

	public ImageCode createImageCode(ServletWebRequest request) {
		int width = ServletRequestUtils.getIntParameter(request.getRequest(), "width",
				securityProperties.getCode().getImage().getWidth());
		int height = ServletRequestUtils.getIntParameter(request.getRequest(), "height",
				securityProperties.getCode().getImage().getHeight());
		
		logger.info("[ValidateCodeController] createImageCode() width: "+width); 
		
		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

		Graphics g = image.getGraphics();

		Random random = new Random();

		g.setColor(getRandColor(200, 250)); 
		g.fillRect(0, 0, width, height);
		g.setFont(new Font("Times New Roman", Font.ITALIC, 20));
		g.setColor(getRandColor(160, 200));
		for (int i = 0; i < 155; i++) {
			int x = random.nextInt(width);
			int y = random.nextInt(height);
			int xl = random.nextInt(12);
			int yl = random.nextInt(12);
			g.drawLine(x, y, x + xl, y + yl);
		}

		String sRand = "";
		for (int i = 0; i < securityProperties.getCode().getImage().getLength(); i++) {
			String rand = String.valueOf(random.nextInt(10));
			sRand += rand;
			g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
			g.drawString(rand, 13 * i + 6, 16);
		}

		g.dispose();

		return new ImageCode(image, sRand, securityProperties.getCode().getImage().getExpireIn());
	}
	
	*//**
	 * 生成随机背景条纹
	 * 
	 * @param fc
	 * @param bc
	 * @return
	 *//*
	private Color getRandColor(int fc, int bc) {
		Random random = new Random();
		if (fc > 255) {
			fc = 255;
		}
		if (bc > 255) {
			bc = 255;
		}
		int r = fc + random.nextInt(bc - fc);
		int g = fc + random.nextInt(bc - fc);
		int b = fc + random.nextInt(bc - fc);
		return new Color(r, g, b);
	}

	public SecurityProperties getSecurityProperties() {
		return securityProperties;
	}

	public void setSecurityProperties(SecurityProperties securityProperties) {
		this.securityProperties = securityProperties;
	}*/
}
